Fix memory leak in Deferred by clearing closure references #1789
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #972 - Memory leak when using Deferred objects
This PR addresses a memory leak issue where using
Deferredobjects caused excessive memory usage (15x increase in the reported case). The root cause was closures holding references to their captured context, preventing garbage collection.Changes Made
$executorparameter and afinallyblock to clear the reference after execution$this->stateand$this->resultto local variables to avoid capturing$thisin closuresunset($task)after task execution to help garbage collectionTest Results
Impact
The fix ensures proper cleanup of closure references after promise resolution, preventing memory from accumulating across multiple query executions. This addresses the issue where 4000 items with Deferred would use ~60MB, with the fix showing stable memory usage across iterations.
🤖 Generated with Claude Code